/*******************************************************************************
 * FilePath    : /Software/Examples_Adv_MS1642/adv_app_RSSI/Src/User/AHL_RSSI_Data.c
 * Version     : 1.0
 * Brief       :
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-05-11 14:56:28
 * LastEditors : AndrewHu
 * LastEditTime: 2023-09-04 17:54:23
 * Description : 数据格式转换
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
// #include <AHL_RSSI_Includes.h>
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
#define BLE_DATA_RSSI_ARRY_LEN 8
#define BLE_DATA_ID_LEN 9
typedef struct advData
{
  u8 ID[BLE_DATA_ID_LEN];              //
  u8 Rssi;                             //
  u8 rssiArry[BLE_DATA_RSSI_ARRY_LEN]; //
  u8 rssiIn;                           //
  u8 rssiInFlag;                       // RSSI[]满标志位
} BLE_DATA;
/* Private define ------------------------------------------------------------*/
#define BLE_DATA_LEN 20
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
BLE_DATA bleData[BLE_DATA_LEN] = {0};
u8 bleDataIn = 0x00;

u8 testID[9] = {
    0xac, 0xfe, 0x0a, 0x19, 0xb2, 0x47, 0xa2, 0x7f, 0x01, //
};
u8 testTimes = 0x00;
/* Private function ----------------------------------------------------------*/
/* extern --------------------------------------------------------------------*/
u8 Data_Compare(u8 *arry1, u8 *arry2, u16 len)
{ // 比较字符串
  u8 i;
  for (i = 0; i < len; i++)
  {
    if (arry1[i] != arry2[i])
      return 0;
  }
  return 1;
}
void Data_Memcpy(u8 *tgtArry, u8 *objArry, u16 len)
{ // 数据搬运
  u8 i = 0;
  for (i = 0; i < len; i++)
  {
    tgtArry[i] = objArry[i];
  }
}
void Data_ArryInit(u8 *arry, u16 start, u16 len, u8 data)
{ // 初始化
  u8 i;
  for (i = 0; i < len; i++)
  {
    arry[start] = data;
    start++;
  }
}

// 返回ret
u8 *Fun_IsBleData(u8 *arry, u8 rssi)
{
  u8 i, j, k;
  u16 rssiVal;
  u8 *ret;

  // Uart_Send_String((u8 *)"\r\n", 2);
  // Uart_Send_Array2Ascii(arry, 9, 1);
  // Uart_Send_String((u8 *)"RSSI:", 7);
  // Uart_Send_Byte2Ascii(rssi);

  for (i = 0; i < BLE_DATA_LEN; i++)
  {
    if (Data_Compare(arry, bleData[i].ID, BLE_DATA_ID_LEN) == 1)
    { // 找到对应数据内容

      bleData[i].rssiArry[bleData[i].rssiIn] = rssi; // 保存rssi
      bleData[i].rssiIn++;
      if (bleData[i].rssiIn >= BLE_DATA_RSSI_ARRY_LEN)
      {
        bleData[i].rssiIn = 0;
        bleData[i].rssiInFlag = TRUE;
      }

      // 计算平均值
      if (bleData[i].rssiInFlag == TRUE)
        j = BLE_DATA_RSSI_ARRY_LEN;
      else
        j = bleData[i].rssiIn;

      rssiVal = 0;
      for (k = 0; k < j; k++)
      {
        rssiVal += bleData[i].rssiArry[k];
      }
      bleData[i].Rssi = rssiVal / j;

      // Uart_Send_String((u8 *)" ID:", 4);
      // Uart_Send_Array2Ascii(bleData[i].ID, BLE_DATA_ID_LEN, 1);
      // Uart_Send_String((u8 *)" RA:", 4);
      // Uart_Send_Array2Ascii(bleData[i].rssiArry, BLE_DATA_RSSI_ARRY_LEN, 1);
      // Uart_Send_String((u8 *)" VA:", 4);
      // Uart_Send_Byte2Ascii(bleData[i].Rssi);

      // test
      if (Data_Compare(arry, testID, 9) == 1)
      {
        // Uart_Send_Array2Ascii(bleData[i].ID, 10, 1);
        if (bleData[i].Rssi > 127)
        { // 负数
          k = 0xff - bleData[i].Rssi;
          if (k > 60)
            Led_set(1);
          else if (k < 55)
          {
            testTimes = 0x00;
            Led_set(0);
          }
        }
        else
        { // 正数
          testTimes = 0x00;
          Led_set(0);
        }
      }

      return bleData[i].ID; // 返回当前的地址
    }
  }

  // 未找到对象，保存该对象，并初始化
  Data_Memcpy(bleData[bleDataIn].ID, arry, 9);         // 保存ID
  bleData[bleDataIn].Rssi = rssi;                      // 初始化RSSI
  Data_ArryInit(bleData[bleDataIn].rssiArry, 0, 8, 0); // 初始化数组
  bleData[bleDataIn].rssiArry[0] = rssi;
  bleData[bleDataIn].rssiIn = 1;     // 初始化写入
  bleData[bleDataIn].rssiInFlag = 0; // 初始化标志

  ret = bleData[bleDataIn].ID; // 返回当前的地址

  // Uart_Send_String((u8 *)"\r\n", 2);
  // Uart_Send_Array2Ascii(bleData[bleDataIn].rssiArry, BLE_DATA_RSSI_ARRY_LEN, 1);

  bleDataIn++;
  if (bleDataIn >= BLE_DATA_LEN)
    bleDataIn = 0;

  return ret;
}
/*******************************************************************************
 * Function    : AHL_RSSI_Data
 * Brief       : rssi过滤
 * Parameter   : {u8*}-rssi参数输入
 * Returns     : {u8}-返回过滤后的rssi
 * Date        : 2023-05-04 10:26:19
 * Description :
 ******************************************************************************/
u8 *AHL_RSSI_Data(u8 *arry, u8 len, u8 *ret)
{
  // rssi,adv type,data length,mac addr,adv data
  u8 *point;
  u8 lengh;
  u8 rssi;

  rssi = arry[0];
  lengh = arry[2];

  point = arry;
  point += 9;

  lengh -= 6; // mac
  while (lengh)
  {
    if (point[0] == 0x0a)
    {
      if (point[1] == 0xff)
      { // 找到需要的信息
        *ret = 1;
        return Fun_IsBleData(&point[2], rssi);
      }
    }

    if (lengh > point[0])
    { // 指向下一结构
      lengh -= point[0];
      point += point[0];
      point++;
    }
    else
      break; // 整段数据处理完成
  }
  *ret = 0;

  return point; // 未找到设备
}
